package com.wy.jarscan;//package com.qm.erp.issue;
//
//import com.alibaba.fastjson.JSONObject;
//import com.qm.erp.fw.adapter.rpc.RemoteClient;
//import io.swagger.annotations.ApiOperation;
//
//import java.io.File;
//import java.io.IOException;
//import java.lang.reflect.Method;
//import java.lang.reflect.Parameter;
//import java.lang.reflect.ParameterizedType;
//import java.lang.reflect.Type;
//import java.util.ArrayList;
//import java.util.Enumeration;
//import java.util.List;
//import java.util.jar.JarEntry;
//import java.util.jar.JarFile;
//
///**
// * @author wangyong
// * @version 1.0
// * @description
// * @date 2023-06-21 15:41
// */
//public class JarInterfaces {
//    public static List<String> searchList = new ArrayList<>();
//
//    static {
//        searchList.add("qm-erp-co-api");
//        searchList.add("qm-erp-co-query-api");
//        searchList.add("qm-erp-ds-api");
//        searchList.add("qm-erp-ds-query-api");
//        searchList.add("qm-erp-fi-api");
//        searchList.add("qm-erp-fi-query-api");
//        searchList.add("qm-erp-pp-api");
//        searchList.add("qm-erp-pp-query-api");
//        searchList.add("qm-erp-psc-api");
//        searchList.add("qm-erp-psc-query-api");
//
//    }
//
//    public static void main(String[] args) throws IOException, ClassNotFoundException {
//        String classpath = System.getProperty("java.class.path");
//        String[] classpathEntries = classpath.split(File.pathSeparator);
//        List<Class<?>> interfaces = new ArrayList<>();
//
//        for (String classpathEntry : classpathEntries) {
//            File file = new File(classpathEntry);
//            if (needSearch(file)) {
//                List<Class<?>> jarInterfaces = getInterfacesInJar(file.getPath());
//                interfaces.addAll(jarInterfaces);
//            }
//        }
//
//        findIllegalInterfaces(interfaces);
//    }
//
//    /**
//     * 是否需要查找
//     *
//     * @param file 文件
//     * @return 是否
//     */
//    public static boolean needSearch(File file) {
//        if (!file.isFile()) {
//            return false;
//        }
//
//        String name = file.getName();
//        if (!name.endsWith(".jar")) {
//            return false;
//        }
//
//        for (String searchName : searchList) {
//            if (name.contains(searchName)) {
//                return true;
//            }
//        }
//
//        return false;
//    }
//
//    /**
//     * 从jar包中获取接口
//     *
//     * @param jarPath jar包路径
//     * @return 接口列表
//     * @throws IOException
//     * @throws ClassNotFoundException
//     */
//    public static List<Class<?>> getInterfacesInJar(String jarPath) throws IOException, ClassNotFoundException {
//        List<Class<?>> interfaces = new ArrayList<>();
//        JarFile jarFile = new JarFile(new File(jarPath));
//        Enumeration<JarEntry> entries = jarFile.entries();
//        while (entries.hasMoreElements()) {
//            JarEntry jarEntry = entries.nextElement();
//            if (!jarEntry.isDirectory() && jarEntry.getName().endsWith(".class")) {
//                String entryName = jarEntry.getName();
//                String className = entryName.replaceAll("/", ".");
//                className = className.substring(0, className.length() - 6);
//                Class<?> clazz = Class.forName(className);
//                if (clazz.isInterface()) {
//                    interfaces.add(clazz);
//                }
//            }
//        }
//        return interfaces;
//    }
//
//    /**
//     * 查找非法的接口
//     *
//     * @param classes 接口列表
//     */
//    public static void findIllegalInterfaces(List<Class<?>> classes) {
//        for (Class<?> clazz : classes) {
//            if (clazz.getAnnotation(RemoteClient.class) == null) {
//                System.out.println("接口：[" + clazz.getName() + "] 没有添加RemoteClient注解");
//            }
//
//            Method[] declaredMethods = clazz.getDeclaredMethods();
//            for (Method method : declaredMethods) {
//                ApiOperation annotation = method.getAnnotation(ApiOperation.class);
//                if (annotation == null) {
//                    System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 没有添加ApiOperation注解");
//                }
//
//                // 判断返回值类型
//                Type returnType = method.getGenericReturnType();
//                if (returnType.equals(Object.class)) {
//                    System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 返回值为Object");
//                }
//
//                if (returnType.equals(JSONObject.class)) {
//                    System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 返回值为JSONObject");
//                }
//
//                if (returnType instanceof ParameterizedType) {
//                    ParameterizedType type = (ParameterizedType) returnType;
//                    Type[] typeArguments = type.getActualTypeArguments();
//                    for (Type typeArgument : typeArguments) {
//                        if (typeArgument == Object.class) {
//                            System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 返回值含有Object类型");
//                            break;
//                        } else if (typeArgument == JSONObject.class) {
//                            System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 返回值含有JSONObject类型");
//                            break;
//                        } else if (typeArgument instanceof ParameterizedType) {
//                            ParameterizedType innerType = (ParameterizedType) typeArgument;
//                            Type[] innerTypeArguments = innerType.getActualTypeArguments();
//                            for (Type innerTypeArgument : innerTypeArguments) {
//                                if (innerTypeArgument == Object.class) {
//                                    System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 返回值含有Object类型");
//                                    break;
//                                }
//                            }
//                        }
//                    }
//                }
//
//                // 判断参数类型
//                Parameter[] parameters = method.getParameters();
//                for (Parameter parameter : parameters) {
//                    Type parameterizedType = parameter.getParameterizedType();
//                    if (parameterizedType.equals(Object.class)) {
//                        System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 参数:[" + parameter.getName() + "]为Object");
//                    }
//
//                    if (parameterizedType == JSONObject.class) {
//                        System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 参数:[" + parameter.getName() + "]为JSONObject");
//                        break;
//                    }
//
//                    if (parameterizedType instanceof ParameterizedType) {
//                        ParameterizedType type = (ParameterizedType) parameterizedType;
//                        Type[] typeArguments = type.getActualTypeArguments();
//                        for (Type typeArgument : typeArguments) {
//                            if (typeArgument == Object.class) {
//                                System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 参数:[" + parameter.getName() + "] 含有Object类型");
//                                break;
//                            } else if (typeArgument == JSONObject.class) {
//                                System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 参数:[" + parameter.getName() + "] 含有JSONObject类型");
//                                break;
//                            } else if (typeArgument instanceof ParameterizedType) {
//                                ParameterizedType innerType = (ParameterizedType) typeArgument;
//                                Type[] innerTypeArguments = innerType.getActualTypeArguments();
//                                for (Type innerTypeArgument : innerTypeArguments) {
//                                    if (innerTypeArgument == Object.class) {
//                                        System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 参数:[" + parameter.getName() + "] 含有Object类型");
//                                        break;
//                                    }
//
//                                    if (innerTypeArgument == JSONObject.class) {
//                                        System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 参数:[" + parameter.getName() + "] 含有JSONObject类型");
//                                        break;
//                                    }
//                                }
//                            }
//                        }
//                    }
//                }
//            }
//        }
//    }
//}
